# **************************************
# --*-- coding: utf-8 --*--
# @Time    : 2024-11-04
# @Author  : white
# @FileName: option_reg.py
# @Software: PyCharm
# **************************************
import winreg

"""
HKEY_CURRENT_USER：当前用户的注册表键
HKEY_LOCAL_MACHINE：本地机器的注册表键
HKEY_CLASSES_ROOT：类信息的注册表键
HKEY_USERS：用户配置信息的注册表键
HKEY_CURRENT_CONFIG：当前配置信息的注册表键


winreg.REG_SZ：字符串类型，表示文本字符串（常见的文本值）。
winreg.REG_DWORD：双字（32位）整型，表示一个整数值。
winreg.REG_QWORD：四字（64位）整型，表示一个64位整数。
winreg.REG_BINARY：二进制数据，用于存储字节序列（例如配置数据）。
winreg.REG_MULTI_SZ：多字符串类型，表示多个文本字符串（以null分隔的字符串列表，常用于多值配置）。
winreg.REG_EXPAND_SZ：可扩展的字符串，通常包含环境变量（可以使用环境变量，例如%PATH%）。
"""


class Reg:
    def __init__(self, full_path: str):
        if full_path.endswith("HKEY_"): raise ValueError(f"{full_path} head need is 'HKEY_' start!")
        full_path = full_path if "\\" not in full_path else full_path + "\\"
        head, path = full_path.split("\\", maxsplit=1)
        if not hasattr(winreg, head): raise ValueError(f"winreg not attribute {head}!")
        self.full_path = full_path
        self.head = head
        self.path = path
        self.root_key = None

    def __del__(self):
        if self.root_key is not None:
            winreg.CloseKey(self.root_key)

    def __enter__(self):
        return self.root_key

    def __exit__(self):
        self.__del__()

    def open_key(func):
        def wrapper(*args, **kwargs):
            self = args[0]
            if self.root_key is None:
                self.root_key = winreg.OpenKey(getattr(winreg, self.head), self.path, 0, winreg.KEY_ALL_ACCESS)
            return func(*args, **kwargs)

        return wrapper

    @open_key
    def read_key(self, key: str):
        """
        读取属性，无法获取目录key
        """
        return winreg.QueryValueEx(self.root_key, key)

    @open_key
    def read_dir_key(self, sub_dir: str) -> bool:
        """
        读取子目录key
        """
        key_numbers = winreg.QueryInfoKey(self.root_key)[0]
        for index in range(key_numbers):
            sub_key = winreg.EnumKey(self.root_key, index)
            if sub_key == sub_dir:
                return True
        return False

    @open_key
    def create_dir_key(self, sub_dir: str, is_replace=False):
        """
        创建子目录，并设置子属性值
        """
        sub_key = winreg.CreateKey(self.root_key, sub_dir)
        if is_replace:
            self.root_key = sub_key
        return sub_key

    @open_key
    def create_or_change_key(self, key: str, value, _type: int):
        """
        创建或者修改已存在的子属性key值
        """
        # 创建子属性键（值）
        winreg.SetValueEx(self.root_key, key, 0, _type, value)

    @open_key
    def del_dir_key(self, key: str):
        """
        删除目录key
        """
        winreg.DeleteKey(self.root_key, key)

    @open_key
    def del_sub_key(self, key: str):
        """
        删除属性key
        """
        winreg.DeleteValue(self.root_key, key)


if __name__ == '__main__':
    key = "white"
    data_type = winreg.REG_DWORD
    reg_path = r"HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\white"
    reg = Reg(reg_path)
    # reg.read_dir_key("")

    # print(reg.read_key(key))
